package com.tang.crm.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tang.crm.dto.CusDevPlanDto;
import com.tang.crm.entity.CusDevPlan;
import com.tang.crm.mapper.CusDevPlanMapper;
import com.tang.crm.mapper.SaleChanceMapper;
import com.tang.crm.service.CusDevPlanService;
import com.tang.crm.utils.AssertUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class CusDevPlanServiceImpl extends ServiceImpl<CusDevPlanMapper, CusDevPlan> implements CusDevPlanService {

    @Autowired
    private CusDevPlanMapper cusDevPlanMapper;

    @Autowired
    private SaleChanceMapper saleChanceMapper;

    /**
     * 自定义sql查询
     * @param cusDevPlanDto
     * @return
     */
    @Override
    public Map<String, Object> queryCusDevByParams(CusDevPlanDto cusDevPlanDto) {
        Map<String, Object> map = new HashMap<>();
        Page<CusDevPlan> page = new Page<>(cusDevPlanDto.getPage(), cusDevPlanDto.getLimit());
        IPage<Map<String, Object>> mapIPage = cusDevPlanMapper.selectByParams(page, cusDevPlanDto);
        map.put("code", 0);
        map.put("msg", "");
        map.put("count", mapIPage.getTotal());
        map.put("data", mapIPage.getRecords());
        return map;
    }

    /***
     * 添加客户开发计划项数据
     *  1. 参数校验
     *      营销机会ID   非空，数据存在
     *      计划项内容   非空
     *      计划时间     非空
     *  2. 设置参数的默认值
     *      是否有效    默认有效
     *      创建时间    系统当前时间
     *      修改时间    系统当前时间
     *  3. 执行添加操作，判断受影响的行数
     * @param cusDevPlan
     */
    @Override
    public void insertCusDevPlan(CusDevPlan cusDevPlan) {
        /* 参数校验 */
        checkCusDevPlanParams(cusDevPlan);
        /* 设置参数默认值 */
        // 是否有效    默认有效
        cusDevPlan.setIsValid(1);
        // 创建时间    系统当前时间
        cusDevPlan.setCreateDate(new Date());
        // 修改时间    系统当前时间
        cusDevPlan.setUpdateDate(new Date());
        // 执行添加操作，判断受影响的行数
        AssertUtil.isTrue(cusDevPlanMapper.insert(cusDevPlan) != 1, "添加数据失败");
    }

    /**
     * 更新客户开发计划项数据
     *  1. 参数校验
     *      计划项ID     非空，数据存在
     *      营销机会ID   非空，数据存在
     *      计划项内容   非空
     *      计划时间     非空
     *  2. 设置参数的默认值
     *      修改时间    系统当前时间
     *  3. 执行更新操作，判断受影响的行数
     * @param cusDevPlan
     */
    @Override
    public void updateCusDevPlan(CusDevPlan cusDevPlan) {
        /* 1. 参数校验 */
        // 判断原数据是否存在
        AssertUtil.isTrue(cusDevPlan.getId() == null
                || cusDevPlanMapper.selectById(cusDevPlan.getId()) == null, "数据异常，请重试");
        checkCusDevPlanParams(cusDevPlan);
        /* 设置参数的默认值 */
        // 修改时间    系统当前时间
        cusDevPlan.setUpdateDate(new Date());
        // 执行更新操作，判断受影响的行数
        AssertUtil.isTrue(cusDevPlanMapper.insert(cusDevPlan) != 1, "更新数据失败");
    }

    /**
     * 删除计划项
     *  1. 判断ID是否为空，且数据存在
     *  2. 执行删除操作
     * @param id
     */
    @Override
    public void deleteCusDevPlan(Integer id) {
        // 判断ID是否为空，且数据存在
        AssertUtil.isTrue(id == null, "删除记录不存在");
        AssertUtil.isTrue(cusDevPlanMapper.deleteById(id) != 1, "删除数据失败");
    }

    public void checkCusDevPlanParams(CusDevPlan cusDevPlan){
        // 判断营销机会ID是否为空
        Integer id = cusDevPlan.getSaleChanceId();
        AssertUtil.isTrue(id == null || saleChanceMapper.selectById(id) == null, "数据异常，请重试");
        // 判断计划项内容是否为空
        AssertUtil.isTrue(StringUtils.isBlank(cusDevPlan.getPlanItem()), "计划项内容不能为空");
        // 判断计划时间是否为空
        AssertUtil.isTrue(cusDevPlan.getPlanDate() == null, "计划时间不能为空");
    }
}
